#ifndef RADARCONTROLLER_H
#define RADARCONTROLLER_H

#include <QObject>
#include <QTcpSocket>
#include "TcpClient.h"
#include <QHostAddress>
#include "Tools.h"

QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE

enum class WorkMode
{
    StandBy,    // 待机模式
    CirSweep1s, // 周扫一秒一圈
    CirSweep2s, // 周扫两秒一圈
    FanSweep    // 扇扫（暂不支持）
};

struct RadarConfigParm
{
    uint32_t freq = 0;  // 频点 0-3 (0: 10.425GHz  1: 10.475GHz  2: 10.525GHz  3: 10.565GHz)
    uint32_t speed = 0; // 速度门限 0-3 (0: 0.25m/s  1: 0.5m/s  2: 0.75m/s  3: 1m/s)
    uint32_t cfar = 0;  // 检测门限 0-3 (0: 低门限  1: 正常门限  2: 高门限) (一般用低门限)
    uint32_t rcs = 0;   // rcs门限 0-3 (0: 关  1: 0.001㎡  2: 0.01㎡  3: 0.05㎡)
};

class RadarController : public QObject
{
    Q_OBJECT
public:
    RadarController(QHostAddress ip, int port, QObject *parent = nullptr);

public:
    void getConfigParm();                   // 获取雷达参数以及当前工作模式，onRecvConfigParm()为回调函数
    void setConfigParm(RadarConfigParm);    // 设置雷达参数
    void getRTK(bool status);               // 开始/结束获取RTK数据，onRecvRTKData()为回调函数
    void run(WorkMode mode);                // 设置雷达工作模式，具体看枚举类WorkMode

public slots:
    void onRecvConfigParm(GetRegResponseMessage);       // 雷达收到雷达参数以及工作模式的回调函数
    void onRecvRTKData(RTKDataMessage rtkMessage);      // 雷达收到RTK数据的回调函数
    void onRecvTrackDataV2(TrackDataV2Message trackData);   // 雷达收到V2版本轨迹数据的回调函数
    void onRecvTrackDataV3(TrackDataV3Message trackData);   // 雷达收到V3版本轨迹数据的回调函数

private slots:
    void onRecvLoginResponse();
    void onRecvHeartbeatResponse(uint32_t id);
    void onHeartbeatTimerTimeout();

signals:
   void sendMessage(QString&message);
    void sendPoints(TrackDataV2Message trackData);//将从服务端捕获的数据发送到MainWindow文件中进行处理


private:
    void login();
    uint32_t heartbeat();

private:
    TcpClient *m_tcpClient = nullptr;
    QHostAddress m_ip;
    int m_port;
    RadarConfigParm m_config;
    WorkMode m_mode = WorkMode::StandBy;
private:

    QTimer *m_heartbeatTimer;
    QSet<uint32_t> m_heartbeatRequestSet;
    bool m_isLogin = false;
    int m_timeoutCount = 0;
};

#endif // RADARCONTROLLER_H
